//package com.auth.service.impl;
//
//import com.alibaba.cloud.commons.lang.StringUtils;
//import com.alibaba.fastjson.JSONObject;
//import com.auth.pojo.Bo.TokenBO;
//import com.auth.pojo.dto.Oauth2TokenDto;
//import com.auth.service.AuthService;
//import com.common.enums.LockFlag;
//import com.common.result.CommonResult;
//import com.common.result.ResultCode;
//import com.common.utils.HttpUtils;
//import com.system.api.SystemFeignClient;
//import com.system.pojo.SysUserBO;
//import com.tms.common.core.domain.R;
//import lombok.RequiredArgsConstructor;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.data.redis.core.RedisTemplate;
//import org.springframework.security.oauth2.common.OAuth2AccessToken;
//import org.springframework.security.oauth2.provider.endpoint.TokenEndpoint;
//import org.springframework.stereotype.Service;
//import org.springframework.web.HttpRequestMethodNotSupportedException;
//
//import java.security.Principal;
//import java.util.Map;
//
//@Service
////@Slf4j
//@RequiredArgsConstructor
//public class AuthServiceImpl implements AuthService {
//    private final TokenEndpoint tokenEndpoint;
//    private final SystemFeignClient systemFeignClient;
//    private final RedisTemplate<String,Object> redisTemplate;
//
//    @Value("${bam.serverPort}")
//    public String serverPort;
//
//    @Value("${bam.clientId}")
//    public String clientId;
//
//    @Value("${bam.userInfoUrl}")
//    public String userInfoUrl;
//
//    @Value("${bam.tokenUrl}")
//    public String tokenUrl;
//
//    @Value("${bam.clientSecret}")
//    public String clientSecret;
//
//    @Override
//    public R<TokenBO> postAccessToken(
//            Principal principal, Map<String, String> parameters)
//            throws HttpRequestMethodNotSupportedException {
//        if(StringUtils.isNotBlank(parameters.get("code"))){
//            return postBamToken(principal,parameters);
//        }
//        // 初始化
//        TokenBO tokenBO = new TokenBO();
//
//        // 生成token
//        OAuth2AccessToken oAuth2AccessToken =
//                tokenEndpoint.postAccessToken(principal, parameters).getBody();
//        Oauth2TokenDto oauth2TokenDto = Oauth2TokenDto.builder()
//                .token(oAuth2AccessToken.getValue())
//                .refreshToken(oAuth2AccessToken.getRefreshToken().getValue())
//                .expiresIn(oAuth2AccessToken.getExpiresIn())
//                .tokenHead("Bearer ").build();
//
//        // 设置token
//        tokenBO.setToken(oauth2TokenDto);
//
//        // 远程查询用户基础信息
//        SysUserBO sysUserBO = new SysUserBO();
//        CommonResult<SysUserBO> result = systemFeignClient.getUser(parameters.get("username"));
//        if (ResultCode.SUCCESS.getCode() == result.getCode()) {
//            sysUserBO = result.getData();
//        }
//
//        if (null == sysUserBO
//                || null == sysUserBO.getLockFlag()
//                || LockFlag.locked.getValue().equals(sysUserBO.getLockFlag())) {
//            return CommonResult.failed(ResultCode.LOCKEDUSER);
//        }
//
//        // 设置用户明细信息
//        tokenBO.setSysUserBO(sysUserBO);
//
//        // 设置用户缓存默认值(token)
//        redisTemplate.opsForValue().getAndSet(String.valueOf(sysUserBO.getUserId()), oAuth2AccessToken.getValue());
//
//        return CommonResult.success(tokenBO);
//    }
//
//    @Override
//    public R<TokenBO> postBamToken(Principal principal,Map<String, String> parameters) throws HttpRequestMethodNotSupportedException {
//        // 初始化
//        TokenBO tokenBO = new TokenBO();
//        // 根据授权码 查询获取token
//        JSONObject token = getToken(parameters);
//        if(StringUtils.isNotEmpty(token.getString("errcode"))){
//            log.error("bam 返回 errcode :{},错误信息:{}",token.getString("errcode"), token.getString("msg"));
//            return CommonResult.failed("当前bam 授权码code值已过期 !");
//        }
//        Oauth2TokenDto oauth2TokenDto = Oauth2TokenDto.builder()
//                .token(token.getString("access_token"))
//                .refreshToken(token.getString("refresh_token"))
//                .expiresIn(token.getInteger("expires_in"))
//                .tokenHead("Bearer ").build();
//
//        // 设置token
//        tokenBO.setToken(oauth2TokenDto);
////         根据token 获取集团用户工号
//        JSONObject userInfo = getUserInfo(token.getString("access_token"));
//        if(StringUtils.isNotEmpty(token.getString("errcode"))){
//            log.error("bam 返回 errcode :{},错误信息:{}",token.getString("errcode"), token.getString("msg"));
//            return CommonResult.failed("当前token值已过期 !");
//        }
//        String empNum = userInfo.getString("employeeNumber");
//        log.info("当前登录员工工号 ： {}",empNum);
//        // 根据集团用户工号 查询获取用户信息
//        // 远程查询用户基础信息
//        SysUserBO sysUserBO = new SysUserBO();
//        CommonResult<SysUserBO> result = systemFeignClient.getUserByUserCode(empNum);
//        if (ResultCode.SUCCESS.getCode() == result.getCode()) {
//            sysUserBO = result.getData();
//        }
//
//        if (null == sysUserBO
//                || null == sysUserBO.getLockFlag()
//                || LockFlag.locked.getValue().equals(sysUserBO.getLockFlag())) {
//            return CommonResult.failed(ResultCode.LOCKEDUSER);
//        }
//        log.info("用户信息获取成功!");
//        // 设置用户明细信息
//        tokenBO.setSysUserBO(sysUserBO);
//        // 重写token(param设置参数) 设置成客户端模式!
//        parameters.remove("code");
//        parameters.put("username", sysUserBO.getUserName());
//        parameters.put("password", sysUserBO.getPassword());
//        parameters.put("grant_type", "password");
//        parameters.put("client_id", "client-app");
//        parameters.put("client_secret","123456");
//        OAuth2AccessToken oAuth2AccessToken =
//                tokenEndpoint.postAccessToken(principal, parameters).getBody();
//        Oauth2TokenDto newOauth2TokenDto = Oauth2TokenDto.builder()
//                .token(oAuth2AccessToken.getValue())
//                .refreshToken(oAuth2AccessToken.getRefreshToken().getValue())
//                .expiresIn(oAuth2AccessToken.getExpiresIn())
//                .tokenHead("Bearer ").build();
//        tokenBO.setToken(newOauth2TokenDto);
//        log.info("token 重写成功");
//        // 设置用户缓存默认值(token)
//        redisTemplate.opsForValue().getAndSet(String.valueOf(sysUserBO.getUserId()), oAuth2AccessToken.getValue());
//
//        return CommonResult.success(tokenBO);
//    }
//
//    public JSONObject getToken(Map<String, String> parameters){
//
//        // idp认证通过后返回的参数
//        String code=parameters.get("code");
//        log.info("code:"+code);
//        // 业务系统在bam-console配置后自动生成的secret
//        // idp的服务器地址和端口
//        // 组装请求地址和参数，获取用户认证后的token信息
//        String getTokenUrl=serverPort+tokenUrl+"?client_id="+clientId
//                +"&grant_type=authorization_code&code="+code+"&client_secret="+clientSecret;
//        JSONObject json = new JSONObject();
//        log.info("bam系统请求地址："+getTokenUrl);
//        String response = HttpUtils.sendPost(getTokenUrl, json.toString(), 1, "", "");
//        JSONObject tokenResponse=JSONObject.parseObject(response);
//
//
////        // 从token中获取用户的uid
////        String uid=tokenResponse.getString("uid");
////        // 从token中获取访问权限token
////        String access_token=tokenResponse.getString("access_token");
////        // 组装请求地址和参数，获取登陆用户的loginName.
//
//        return tokenResponse;
//    }
//
//    public JSONObject getUserInfo(String access_token){
//        String getUserInfoUrl=serverPort+userInfoUrl;
//        String response = HttpUtils.sendGet(getUserInfoUrl, "access_token="+access_token+"&client_id="+clientId, 1, "", "");
//        return JSONObject.parseObject(response);
//    }
//}
